package com.knife.easyexcel.read.validator.impl;

import com.knife.easyexcel.read.data.ImportValidatorContext;
import com.knife.easyexcel.read.validator.ImportValidator;
import org.apache.commons.lang3.reflect.FieldUtils;

/**
 * 扩展了校验器，主要是提供回写id的操作
 * tips：通常我们校验某个数据是否存在时，会根据编码找到数据的id，持久化时，存入数据库的是该数据id。
 *       为了减少在做导入时，重复获取该数据id，这里提供了setId方法，支持在校验过程中，就将数据id回写到实体中。导入时，直接取id即可。
 * @author lth
 * @created 2025年07月16日 星期三 11:05
 */
public abstract class ValidateAndSetterValidator<T> implements ImportValidator<T> {
    /**
     * 回写的id字段名
     */
    private String idKey;

    public ValidateAndSetterValidator(String idKey) {
        this.idKey = idKey;
    }

    /**
     * 获取id
     * @param cuxImportValidatorContext 过滤器链中的校验器上下文
     * @param t 实体对象
     * @return id
     * @throws IllegalAccessException 异常
     */
    public abstract String getId(ImportValidatorContext<T> cuxImportValidatorContext, T t) throws IllegalAccessException;

    /**
     * 回写id，到实体的idKey属性中
     * @param cuxImportValidatorContext 过滤器链中的校验器上下文
     * @param t 实体对象
     * @throws IllegalAccessException 异常
     */
    public void setId(ImportValidatorContext<T> cuxImportValidatorContext, T t) throws IllegalAccessException {
        FieldUtils.writeField(t, idKey, getId(cuxImportValidatorContext, t), true);
    }
}